package com.lagou.homework135;

import java.util.*;

/**
 * 使用集合实现斗地主游戏的部分功能，要求如下：
 * （1）首先准备 54 张扑克牌并打乱顺序。
 * （2）由三个玩家交替摸牌，每人 17 张扑克牌，最后三张留作底牌。
 * （3）查看三个玩家手中的扑克牌和底牌。
 * （4）其中玩家手中的扑克牌需要按照大小顺序打印，规则如下：
 * 手中扑克牌从大到小的摆放顺序：大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3
 */
public class FightTheLandlord {

    public static void main(String[] args) {
        //（1）首先准备 54 张扑克牌并打乱顺序。
        FightTheLandlord.initPoker();
        //（2）由三个玩家交替摸牌，每人 17 张扑克牌，最后三张留作底牌。
        FightTheLandlord.dealCards();
        //（3）查看三个玩家手中的扑克牌和底牌。
        FightTheLandlord.showCards("玩家1", player1);
        FightTheLandlord.showCards("玩家2", player2);
        FightTheLandlord.showCards("玩家3", player3);
        FightTheLandlord.showCards("底牌", lastPoker);
        //（4）其中玩家手中的扑克牌需要按照大小顺序打印
        System.out.println("----------------------------------");
        FightTheLandlord.sortCards("玩家1", player1);
        FightTheLandlord.sortCards("玩家2", player2);
        FightTheLandlord.sortCards("玩家3", player3);

    }

    public static HashMap<Integer, String> poker = new HashMap<>(); //牌面值
    public static List<Integer> pokerNum; // 牌面索引

    public static List<Integer> player1 = new ArrayList<>();
    public static List<Integer> player2 = new ArrayList<>();
    public static List<Integer> player3 = new ArrayList<>();
    public static List<Integer> lastPoker = new ArrayList<>();

    //生成扑克牌
    static void initPoker() {
        List<String> color = new ArrayList<>();
        List<String> point = new ArrayList<>();
        Collections.addAll(color, "♥", "♠", "♣", "♦");
        //只需调换2 A位置，就能实现指定的排序
        Collections.addAll(point, "2", "A", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K");
        poker.put(0, "大王");
        poker.put(1, "小王");
        int serialNum = 2;
        for (String d : point) {
            for (String c : color) {
                poker.put(serialNum, c + d);
                serialNum++;
            }
        }
        // 用poker整数类型的key来打乱顺序
        Set<Integer> key = poker.keySet();
        pokerNum = new ArrayList(key);
        Collections.shuffle(pokerNum);
        System.out.println("打乱顺序后的牌面索引：" + pokerNum);
        System.out.println("打乱顺序后的牌面：");
        for (int i = 0; i < poker.size(); i++) {
            if (i % 10 == 9)
                System.out.println(poker.get(pokerNum.get(i)) + "  ");
            else
                System.out.print(poker.get(pokerNum.get(i)) + "  ");
        }
//        System.out.println(poker.size());
    }


    public static void dealCards() {
        for (int i = 0; i < pokerNum.size(); i++) {
            if (i >= 51) {
                lastPoker.add(pokerNum.get(i));
            } else if (i % 3 == 1) {
                player1.add(pokerNum.get(i));
            } else if (i % 3 == 2) {
                player2.add(pokerNum.get(i));
            } else {
                player3.add(pokerNum.get(i));
            }
        }
        System.out.println("\n--------------------------------------");
    }

    public static void showCards(String playName, List<Integer> player) {
//        System.out.println(playName + "牌面索引:" + player);
//        Collections.sort(player);
        System.out.print(playName + "牌面：");
        for (Integer i : player) {
            String str = poker.get(i);
            System.out.print(str + "  ");
        }
        System.out.println();
    }

    public static void sortCards(String playName, List<Integer> player) {
        List<Integer> temp1 = new ArrayList(); // 大王，小王，2 ，A
        List<Integer> temp2 = new ArrayList(); // K - 3
        for (Integer i : player) {
            if (i <= 9)
                temp1.add(i);
            else
                temp2.add(i);
        }
        Collections.sort(temp1);
        //通过实现Comparator接口的compare方法来完成自定义排序
        Collections.sort(temp2, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                // 返回值为int类型，大于0表示正序，小于0表示逆序
                return o2 - o1;
            }
        });
        temp1.addAll(temp2);
        showCards(playName, temp1);
    }

}
